﻿using System;
using System.Net;

namespace Request
{
    /// <summary>
    /// Методы для выполнения асинхронного PUT запроса на сервер
    /// </summary>
    public interface IPutAsync
    {
        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(Uri url, object data, Action<string> onSuccess, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(Uri url, object data, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        void PutAsync(Uri url, object data, Action<string> onSuccess);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        void PutAsync(Uri url, object data);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(Uri url, Action<string> onSuccess, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        void PutAsync(Uri url, Action<string> onSuccess);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(Uri url, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(Uri url, string data, Action<string> onSuccess, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(Uri url, string data, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        void PutAsync(Uri url, string data, Action<string> onSuccess);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        void PutAsync(Uri url, string data);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        void PutAsync(Uri url);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(string url, object data, Action<string> onSuccess, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(string url, object data, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        void PutAsync(string url, object data, Action<string> onSuccess);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        void PutAsync(string url, object data);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(string url, Action<string> onSuccess, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        void PutAsync(string url, Action<string> onSuccess);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(string url, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(string url, string data, Action<string> onSuccess, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onFalied">Callback неудачного запроса</param>
        void PutAsync(string url, string data, Action<WebException> onFalied);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        /// <param name="onSuccess">Callback успешного результата</param>
        void PutAsync(string url, string data, Action<string> onSuccess);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        /// <param name="data">Параметры запроса</param>
        void PutAsync(string url, string data);

        /// <summary>
        /// Выполняет асинхронный Put запрос на сервер
        /// </summary>
        /// <param name="url">URL сервера</param>
        void PutAsync(string url);
    }
}